package controller

import (
	"gitee.com/song-yao-shun/MQH/dto"
	"gitee.com/song-yao-shun/MQH/model"
	"gitee.com/song-yao-shun/MQH/response"
	"gitee.com/song-yao-shun/MQH/respository"
	"gitee.com/song-yao-shun/MQH/vo"
	"github.com/gin-gonic/gin"
	"strconv"
)

type INodeController interface {
	RestController
}

type NodeController struct {
	NodeRty respository.NodeRepository
}

func (n NodeController) Create(ctx *gin.Context) {
	// 接收参数
	var voRequest vo.CreateNodeRequest
	if err := ctx.ShouldBind(&voRequest); err != nil {
		response.Fail(ctx, nil, "数据验证错误！")
		return
	}

	if voRequest.SceneId != 0 {
		s := respository.NewSceneRepository()
		_, err := s.SelectById(voRequest.SceneId)
		if err != nil {
			response.Fail(ctx, nil, "测试场景不存在！")
			return
		}
	}

	if voRequest.FctId != 0 {
		f := respository.NewFctRepository()
		_, err := f.SelectById(voRequest.FctId)
		if err != nil {
			response.Fail(ctx, nil, "页面功能不存在！")
			return
		}
	}

	// 创建 Node
	result := model.Node{
		FctId: 		voRequest.FctId,
		SceneId: 	voRequest.SceneId,
		Name: 		voRequest.Name,
	}

	resultId, err := n.NodeRty.Create(result)
	if err != nil {
		response.Fail(ctx, nil, "新建失败！")
		return
	}

	// 返回
	response.Success(ctx, gin.H{"data":resultId}, "新建成功！")
}

func (n NodeController) Update(ctx *gin.Context) {
	// 接收参数
	var voRequest vo.UpdateNodeRequest
	if err := ctx.ShouldBind(&voRequest); err != nil {
		response.Fail(ctx, nil, "数据验证错误，请检查提交的内容！")
		return
	}

	// 获取 path 中的参数
	pathId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	updateResult, err := n.NodeRty.SelectById(pathId)
	if err != nil {
		response.Fail(ctx, nil, "测试场景的节点不存在！")
		return
	}

	// 判断数据是否更新
	if updateResult.SceneId == voRequest.SceneId &&
		updateResult.FctId == voRequest.FctId &&
		updateResult.Name == voRequest.Name {
		response.Success(ctx, nil, "无修改。")
		return
	}

	// 判断变更后的 sceneid 是否有效
	if voRequest.SceneId != 0 && updateResult.SceneId != voRequest.SceneId{
		s := respository.NewSceneRepository()
		_, err := s.SelectById(voRequest.SceneId)
		if err != nil {
			response.Fail(ctx, nil, "修改后的 测试场景 不存在！")
			return
		}
		updateResult.SceneId = voRequest.SceneId
	}

	// 判断变更后的 fctid 是否有效
	if voRequest.FctId != 0 && updateResult.FctId != voRequest.FctId{
		f := respository.NewFctRepository()
		_, err := f.SelectById(voRequest.FctId)
		if err != nil {
			response.Fail(ctx, nil, "修改后的 页面功能 不存在！")
			return
		}
		updateResult.FctId = voRequest.FctId
	}

	// 更新name
	if voRequest.Name != "" {
		runes := []rune(voRequest.Name)
		if len(runes) < 2 || len(runes) > 20{
			response.Fail(ctx, nil, "修改后的 名称 不合法！")
			return
		}
		if updateResult.Name != voRequest.Name {
			updateResult.Name = voRequest.Name
		}
	}

	result, err := n.NodeRty.Update(*updateResult)
	if err != nil {
		panic(err)
	}

	response.Success(ctx, gin.H{"data":result}, "修改成功。")
}

func (n NodeController) Show(ctx *gin.Context) {
	// 获取 path 中的参数
	pathId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	result := n.NodeRty.SelectFullNodeById(pathId)
	if result.ID == 0 {
		response.Fail(ctx, nil, "测试场景不存在！")
		return
	}

	response.Success(ctx, gin.H{"data":result}, "")
}

func (n NodeController) Delete(ctx *gin.Context) {
	// 获取 path 中的参数
	pathId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	// 判断存在关联测试用例，不允许删除
	// 待补充

	if rowsAffected := n.NodeRty.DeleteById(pathId);rowsAffected != 1 {
		response.Fail(ctx, nil, "删除失败，请重试！")
		return
	}

	response.Success(ctx, nil, "删除成功！")
}

func (n NodeController) List(ctx *gin.Context) {
	// 接收参数
	var voList vo.NodeList
	if err := ctx.ShouldBind(&voList); err != nil {
		response.Fail(ctx, nil, "数据验证错误，请检查提交的内容！")
		return
	}

	results, total := n.NodeRty.List(voList)

	if voList.SelectType != ""{
		response.Success(ctx, gin.H{"data":dto.ToNodeDto(results), "total":total}, "查询列表成功。")
		return
	}
	response.Success(ctx, gin.H{"data":results, "total":total}, "查询列表成功。")
}

func NewNodeController() INodeController{
	return NodeController{NodeRty: respository.NewNodeRepository()}
}


